home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / tex / inputs / tabls.sty < prev    next >
Text File  |  1991-05-20  |  8KB  |  175 lines

  1. %
  2. %  T A B L S . S T Y
  3. %
  4. %  Copyright (c) 1989, 1990 by Donald Arseneau 
  5. %  from
  6. %  LaTeX, Copyright (c) 1985 by Leslie Lamport
  7. %  
  8. %  Modify LaTeX's table building macros to keep text from touching
  9. %  text or hlines above or below.  See instructions after \endinput.
  10. %
  11. %----------------------------------------------------------------------
  12.  
  13. %  create registers and default settings:
  14.  
  15. \newdimen\tablelineskip \tablelineskip= 1pt
  16. \newdimen\extrarulesep  \extrarulesep = 3pt
  17.  
  18. \newdimen\@arstdepth \newdimen\@arstheight \newdimen\@skip@bove
  19.  
  20. % Change the initializations to create a smaller strut and include
  21. % my macros in the initialization for the preamble.
  22.  
  23. \def\@array[#1]#2{%  This works for both tabular and array because of this test:
  24.  \ifx\@classz\@arrayclassz \let\@tarlineskip\z@
  25.  \else \let\@tarlineskip\tablelineskip 
  26. %  remember global variables to allow recursion
  27.    \edef\@unrecurse{\global\@skip@bove\the\@skip@bove
  28.      \global\@arstheight\the\@arstheight\global\@arstdepth\the\@arstdepth}%
  29.  \fi \let\@rememsize\relax \let\@seesize\relax
  30.  \@mkpream{#2}%
  31.  \@tempdima\arraystretch\ht\strutbox \@tempdimb\arraystretch\dp\strutbox 
  32.  \ifdim\@tarlineskip>\z@ 
  33.    \def\@rememsize{\protect\@r@m@msize}\let\@seesize\@s@@size 
  34.    \advance\@tempdima-.5\@tarlineskip \advance\@tempdimb-.5\@tarlineskip 
  35.  \fi \setbox\@arstrutbox=\hbox{% set up smaller strut
  36.     \vrule \@height\@tempdima \@depth\@tempdimb \@width\z@}%
  37.  \edef\@preamble{\halign \noexpand\@halignto \bgroup 
  38.  \tabskip\z@ \unhcopy\@arstrutbox \@preamble \tabskip\z@ &\@sharp \cr}%
  39. % I have added an extra column (&\@sharp) to take the smart strut.
  40. % The strut is still needed for the array environment.
  41.  \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
  42.  \if#1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
  43.  \bgroup \let\par\relax 
  44.  \global\@arstheight\ht\@arstrutbox \global\@arstdepth\dp\@arstrutbox
  45.  \global\@skip@bove\z@ \advance\extrarulesep.5\arrayrulewidth
  46.  \let\@sharp##\let\protect\relax \lineskip\z@ \baselineskip\z@ \@preamble}
  47.  
  48. %  Change the meaning of \\ to do the final strut calculation and
  49. %  put in the smart strut
  50.  
  51. \def\@xtabularcr{\@ifnextchar[{\@argtabularcr}{\@argtabularcr[\z@]}}
  52.  
  53. \def\@argtabularcr[#1]{\@ifnextchar\hline
  54.    {\@mystrutcr\extrarulesep[#1]}% Note: \@tempc is next char from \@ifnextchar
  55.    {\ifx\@tempc\cline\@mystrutcr\extrarulesep[#1]\else\@mystrutcr\z@[#1]\fi}}
  56.  
  57. \def\@mystrutcr#1[#2]{\ifnum0=`{\fi}&\omit % end group, new column
  58.   \advance\@arstheight\@skip@bove 
  59.   \ifdim#2>\z@ \advance\@arstdepth#2\fi \advance\@arstdepth#1%
  60.   \advance\@arstheight.5\@tarlineskip \advance\@arstdepth.5\@tarlineskip
  61.   \vrule \@height\@arstheight \@depth\@arstdepth \@width\z@
  62.   \global\@arstheight\ht\@arstrutbox \global\@arstdepth\dp\@arstrutbox
  63.   \global\@skip@bove\z@ \cr
  64.   \ifdim#2<\z@ \noalign{\vskip#2}\fi}
  65.  
  66. % Simulate \crcr at the end of the table, assuming that we are not in 
  67. % vmode once a line of entries has started.  This fails to put in a smart 
  68. % strut if the table ends without \\ while in vmode in a column entry.  
  69. % Use \@unrecurse to simulate grouping of global parameters.
  70.  
  71. \def\endtabular{\ifvmode\def\\{\crcr}\fi\\\egroup\@unrecurse\egroup $\egroup}
  72.  
  73. % Put \@seesize...\@rememsize in all preamble templates
  74.  
  75. \def\@tabclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
  76.    \or \or \@addamp \or
  77.    \@acolampacol \or \@firstampfalse \@acol \fi
  78. \edef\@preamble{\@preamble
  79.   \ifcase \@chnum
  80.      \hfil\@seesize\ignorespaces\@sharp\unskip\@rememsize \hfil
  81.      \or \@seesize\ignorespaces\@sharp\unskip\@rememsize \hfil
  82.      \or \hfil\hskip\z@\@seesize\ignorespaces\@sharp\unskip\@rememsize\fi}}
  83.  
  84. \def\@classv{\@addtopreamble{\@seesize\@startpbox{\@nextchar}%
  85.   \ignorespaces\@sharp\@endpbox\@rememsize}}
  86.  
  87. % my macros to keep track of the size of entries.
  88.  
  89. \def\@s@@size{\setbox\z@\hbox\bgroup}
  90.  
  91. \def\@r@m@msize{\egroup % end the \hbox
  92.     \ifdim\ht\z@>\@arstheight \global\@arstheight\ht\z@ \fi
  93.     \ifdim\dp\z@>\@arstdepth  \global\@arstdepth \dp\z@ \fi
  94.     \unhbox\z@}
  95.  
  96. % Redefine \hline to remove nicks and to allow optional [] skip below
  97.  
  98. \def\hline{\noalign{\ifnum0=`}\fi\kern-.5\arrayrulewidth
  99.    \hrule \@height \arrayrulewidth \kern-.5\arrayrulewidth
  100.    \futurelet\@tempa\@xhline}
  101.  
  102. \def\@xhline{\global\@skip@bove\extrarulesep
  103.       \ifx\@tempa\hline\vskip \doublerulesep\else
  104.       \ifx\@tempa[\aftergroup\@yhline\fi\fi
  105.       \ifnum0=`{\fi}}
  106.  
  107. \def\@yhline[#1]{\noalign{\global\advance\@skip@bove#1}}
  108.  
  109. % make \cline give the \extrarulesep below
  110.  
  111. \def\cline#1{\noalign{\global\@skip@bove\extrarulesep}\@cline[#1]}
  112.  
  113. \endinput
  114. % -----------------------------------------------------------------
  115. %
  116. %  Modify LaTeX's tabular environment macros to keep text from touching
  117. %  other text or hlines above or below.  There are two new parameters:
  118. %
  119. %  \tablelineskip: minimum space between text on successive lines in
  120. %                  a tabular environment.  Negative distances are treated
  121. %                  as zero.  There will also be at least .5\tablelineskip 
  122. %                  between an \hline and text (if \extrarulesep >= 0pt).
  123. %                  The default value is 1pt.  Use 0pt for speed.
  124. %
  125. %  \extrarulesep : extra space to add above and below each \hline in 
  126. %                  addition to half the lineskip.  Negative values can 
  127. %                  be used, but only until some text touches the hline.
  128. %                  The default value is 3pt.
  129. %
  130. %  The appearance of normal LaTeX tables can be had with
  131. %        \setlength\tablelineskip{0pt}
  132. %        \setlength\extrarulesep{0pt}
  133. %
  134. %  \hline[dimen]:
  135. %
  136. %  \hline has been changed to take an optional length argument just like \\
  137. %  giving the space to insert below.  This space is in addition to the 
  138. %  \extrarulesep and lineskip.  A negative value will reduce the space until
  139. %  the hline touches some text below, and then will have no further effect.
  140. %  E.g., \hline[-9in] draws a horizontal line while suppressing the extrarulesep
  141. %  beneath.  Also, the new \hline FIXES THE NICKS that used to appear at the 
  142. %  junction between horizontal and vertical lines.
  143. %
  144. %  How it works:
  145. %  There are no struts in the preamble entries (lie), rather, there are 
  146. %  tests to measure the maximum height and depth of all entries on a line.
  147. %  The maximum values start at the size of LaTeX's \@arstrut minus the
  148. %  appropriate lineskip.  At the \\, a strut is inserted (in its own 
  149. %  column) which is that maximum size plus the lineskip plus any additional 
  150. %  space for separation from \hline s.
  151. %
  152. %  The Downside:
  153. %  Building a table will take about twice as much time as before because 
  154. %  the entries have to be boxed twice (by \@seesize and by \halign itself)
  155. %  instead of just once.  \setlength\tablelineskip{0pt} will recover this 
  156. %  speed, with \extrarulesep still partially in effect--extra space will still
  157. %  be added around hlines, but it may be taken up by very tall or very deep
  158. %  table etries; thus text may still touch the lines.
  159. %
  160. %  These macros could be made to apply to arrays too (an earlier version did!)
  161. %  but I think it makes more sense to use TeX's normal smart lineskip
  162. %  mechanism there because of arrays in arrays.  Why doesn't LaTeX???
  163. %
  164. %  In this version, all "skip" registers are converted to "dimen" for speed
  165. %  -- they can't stretch anyway.  \@rememsize was expanded too early by
  166. %  \multicolumn, so it is now \protect-ed.  \endtabular had \crcr "outer"ness
  167. %  problems, so use \def to hide the \crcr.
  168. %
  169. %  Send problem reports to asnd@triumfcl.bitnet or Arseneau@mtsg.ubc.ca
  170. %
  171. %  Test integrity of file:
  172. %  brackets: round, square, curly, angle:   () [] {} <>
  173. %  backslash, slash, vertical, at, dollar, and: \ / | @ $ &
  174. %  hat, grave, acute (apostrophe), quote, tilde:   ^ ` ' " ~
  175.